#include "compte.h"
#include "Banque.h"
#include <typeinfo>
#include <iostream>


long Banque::existe(long num)
{
	for (unsigned int i=0; i<tab.size();i++)
	{
		if(tab[i]->getNum()==num)
		{
			return i;
		}
	} 
	return -1;
}
	
bool Banque::ajouter(const Compte& a)
{
	if (existe(a.getNum())==-1)
	{
		Compte *p;
		p= new Compte(a);
		tab.push_back(p);
		return true;
	}
	else
	return false;
}

bool Banque::ajouter(const CompteCourant& a)
{
	if (existe(a.getNum())==-1)
	{
		CompteCourant *p;
		p= new CompteCourant(a);
		tab.push_back(p);
		return true;
	}
	else
	return false;
}


bool Banque::ajouter(const CompteEpargne& a)
{
	if (existe(a.getNum())==-1)
	{
		CompteEpargne *p;
		p= new CompteEpargne(a);
		tab.push_back(p);
		return true;
	}
	else
	return false;
}


void Banque::afficher()
{
	for (unsigned int i=0;i<tab.size();i++)
	{
		tab[i]->afficher();
	}
}

Banque::~Banque()
{
	for(unsigned int i=0;i<tab.size();i++)
	{
		delete tab[i];//si il n'est pas un tableau de pointeur on doit ecrire==>  delete [];
	}
}


Banque::Banque (const Banque& a)//copier dans un autre vecteur;
{
	Compte *p;
	for(unsigned int i=0; i<a.tab.size();i++)
	{
		if (typeid(*(a.tab[i]))==typeid(Compte))
		{
			p=new Compte(*(a.tab[i]));		
		}
		
		if (typeid(*(a.tab[i]))==typeid(CompteCourant))
		{
			p=new CompteCourant(static_cast <const CompteCourant&> (*(a.tab[i])));
		}
		
		if (typeid(*(a.tab[i]))==typeid(CompteEpargne))
		{
			p=new CompteEpargne(static_cast <const CompteEpargne&> (*(a.tab[i]))); 
		}
		
	tab.push_back(p);
	}
}
	
	
Banque& Banque::operator=(const Banque& a)//surcharger l'operateur egale
{
	Compte *p;
	if (this != &a)
{
		for(unsigned int i=0; i<tab.size(); i++)
		{
		
		delete tab[i];
		}
	
	
	
	tab.clear();
	
	
	for(unsigned int i=0; i<a.tab.size(); i++)
	{
		if (typeid(*(a.tab[i]))==typeid(Compte))
		{
			p=new Compte(*(a.tab[i]));			
		}
		
		if (typeid(*(a.tab[i]))==typeid(CompteCourant))
		{
			p=new CompteCourant(static_cast <const CompteCourant&>(*(a.tab[i])));
		}
		
		if (typeid(*(a.tab[i]))==typeid(CompteEpargne))
		{
			p=new CompteEpargne(static_cast <const CompteEpargne&>(*(a.tab[i]))); 
		}
		
	tab.push_back(p);
	}
}
return *this;
}


Banque::Banque()
{

}
